import numpy as np
from PIL import Image

# 把列表转换为数组
a = np.array([1, 2, 3, 4, 5])
print("把列表转换为数组: ", a)

#把元组转换为数组
a = np.array((1, 2, 3, 4, 5))
print("把元组转换为数组: ",  a)

# 把range对象转换为数组
a = np.array(range(5))
print("把range对象转换为数组: ", a)

# 二维数组
a = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组:\n", a)

# 类似内置函数range，但是返回数组
a = np.arange(8)
print("arange: ", a) # -> [0 1 2 3 4 5 6 7]
a = np.arange(1, 10, 2) # 可以是三个参数 -> [1 3 5 7 9]
print("arange: ", a)

# 等差数组
a = np.linspace(0, 10, 11) # 开始位置、结束位置、数量 -> 公差(10 - 0) / (11 - 1)
print("等差数组: ", a)
a = np.linspace(0, 10, 11, endpoint=False) # endpoint=False不包含终点 -> 公差(10 - 0) / 11
print("等差数组: ", a)

# log
a = np.logspace(0, 100, 10) # 相当于 10 ** np.linspace(0, 100, 10) (底默认是4)
print("logspace 10: ", a)
a = np.logspace(1, 6, 5, base=2)
print("logspace 2: ", a)

# 全0一维数组
a = np.zeros(3)
print("全0一维数组: ", a)

# 全1一维数组
a = np.ones(3)
print("全1一维数组: ", a)

# 全0二位数组，3行3列
a = np.zeros((3, 3))
print("全0二位数组，3行3列:\n", a)

# 全1二位数组，3行1列
a = np.ones((3, 1))
print("全1二位数组，3行1列:\n", a)

# 单位数组
a = np.identity(2)
print("单位数组:\n", a)

# 空数组
a = np.empty((3, 3)) # 只申请空间，其中的元素不一定是0
print("空数组: ", a)

# Hamming视图
a = np.hamming(20)
print("Hamming视图:\n", a)

# Blackman视图
a = np.blackman(10)
print("Blackman视图:\n", a)

# Kaiser窗口
a = np.kaiser(12, 5)
print("Kaiser窗口:\n", a)

# 一维随机数组
a = np.random.randint(0, 50, 5) # 5个[0-50)区间的数字
print("一维随机数组: ", a)

# 3行5列随机数
a = np.random.randint(0, 50, (3, 5))
print("3行5列随机数:\n", a)

# 10个介于0-1之间的随机数
a = np.random.rand(10)
print("10个介于0-1之间的随机数: ", a)

# 从标准正态分布中随机采样5个主子
a = np.random.standard_normal(5)
print("从标准正态分布中随机采样5个数字: ", a)

# 3页4行2列，三维数组
a = np.random.standard_normal(size=(3, 4, 2))
print("3页4行2列，三维数组:\n", a)

# 对角数组
a = np.diag([1, 2, 3, 4])
print("对角数组:\n", a)

# 处理图像
im = Image.new('RGB', size=(5, 5), color=(2, 30, 128))
a = np.array(im)
print("处理图像:\n", a)
print("shape: ", a.shape) # 5页5行3列

# 创建一维数组
a = np.r_[1:10:2]
print("创建一维数组: ", a) # 与上面的是等价的 -> [1 3 5 7 9]

# 创建二位数组
a = np.c_[1:10:2]
print("创建二位数组:\n" ,a)

# 生成和指定数组形状相同的全1数组
a = np.ones_like(range(10))
print("生成和指定数组形状相同的全1数组: ", a)

# 指定全1数组的形状
a = np.ones_like(range(10), shape=(2, 5))
print("指定全1数组的形状:\n", a)

# 生成与指定数组形状相同的全0数组
a = np.zeros_like([[1, 2, 3], [4, 5, 6]])
print("生成与指定数组形状相同的全0数组:\n", a)

# 指定新形状的数组
a = np.zeros_like([[1, 2, 3], [4, 5, 6]], shape=(3, 2))
print("指定新形状的数组:\n", a)
a = np.ones_like([[1, 2, 3], [4, 5, 6]], shape=(3, 5)) # 可以和原数组的形状不同
print("可以和原数组的形状不同:\n", a)

# 3行5列的二维数组，所有元素全为5
a = np.full((3, 5), 5)
print("3行5列的二维数组，所有元素全为5:\n", a)

# 全部替换
a = np.full_like([[1, 2, 3], [4, 5, 6]], 999) # -> 全部替换为999
print("全部替换为999:\n", a)
a = np.full_like([[1, 2, 3], [4, 5, 6]], (7, 8, 9)) # -> 全部替换为 7, 8, 9
print("全部替换为7, 8, 9:\n", a)
a = np.full_like([[1, 2, 3], [4, 5, 6]], [[7], [8]]) # -> 全部替换为 [7], [8]
print("全部替换为[7], [8]:\n", a)

#  [1, 10) 步长为2，返回一维数组
a = np.mgrid[1:10:2]
print("[1, 10) 步长为2，返回一维数组: ", a)

# [-1, 1]区间，5个数字，包括终点1
a = np.mgrid[-1:1:5j]
print("[-1, 1]区间，5个数字，包括终点1: ", a)

# 三维数组，最后的2表示步长，不包括终点
a = np.mgrid[5:10:2, 1:10:2]
print("三维数组，最后的2表示步长，不包括终点:\n", a)

# 三维数组，最后的2表示个数，包括终点
a = np.mgrid[5:10:2j, 1:10:2j]
print("三维数组，最后的2表示个数，包括终点:\n", a)

# 返回网状数据的另一种表示形式，返回形状分别为 (m, 1) 和 (1, n) 的二维数组
x, y = np.ogrid[5:10:2, 1:10:2]
print("网状x:\n", x)
print("网状y: ", y)
print("网状x + y:\n", x + y)

# 根据2个以为数组创建2个二维数组
a = np.meshgrid([1, 2, 3], [4, 5, 6])
print("根据2个以为数组创建2个二维数组:\n", a)

# 使用3个一维数组创建3个三维数组
a = np.meshgrid([1, 2], [3, 4], [5, 6])
print("使用3个一维数组创建3个三维数组:\n", a)


